import numpy as np
import matplotlib.pyplot as plt

# 设置中文显示
plt.rcParams["font.family"] = ["WenQuanYi Micro Hei"]
plt.rcParams["axes.unicode_minus"] = False  # 正确显示负号

# 1. 定义参数和范围
x = np.linspace(0, 5, 1000)  # x轴范围：0到5
ref_start = (0, 0)           # 参考线起点
ref_end = (5, 2)             # 参考线终点

# 2. 计算直线参考线（y = kx + b）
k = (ref_end[1] - ref_start[1]) / (ref_end[0] - ref_start[0])  # 斜率
b = ref_start[1] - k * ref_start[0]                           # 截距
y_ref = k * x + b                                              # 参考线y值

# 3. 定义五次多项式曲线 y = ax⁵ + bx⁴ + cx³ + dx² + ex + f
# 系数设计：确保起点和终点与参考线重合，但末端产生弯曲
a = 0.02   # x⁵项系数（控制末端弯曲程度）
b = -0.2   # x⁴项系数
c = 0.8    # x³项系数
d = -1.0   # x²项系数
e = k + 0.5  # x项系数（与参考线斜率关联）
f = 0      # 常数项（确保过起点）

# 计算五次曲线的y值
y_quintic = a*x**5 + b*x**4 + c*x**3 + d*x**2 + e*x + f

# 4. 计算偏离量（五次曲线与参考线的差值）
deviation = y_quintic - y_ref

# 5. 可视化结果
plt.figure(figsize=(10, 6))

# 绘制参考线和五次曲线
plt.plot(x, y_ref, 'k--', label='直线参考线', linewidth=2)
plt.plot(x, y_quintic, 'r-', label='五次曲线', linewidth=2)

# 突出显示末端偏离区域（x > 3.5的部分）
plt.fill_between(x[x>3.5], y_ref[x>3.5], y_quintic[x>3.5], 
                 color='yellow', alpha=0.3, label='末端偏离区域')

# 标注
plt.scatter([ref_start[0], ref_end[0]], [ref_start[1], ref_end[1]], 
            color='blue', s=50, zorder=5, label='起点/终点')
plt.xlabel('X轴', fontsize=12)
plt.ylabel('Y轴', fontsize=12)
plt.title('五次曲线末端弯曲偏离参考线模拟', fontsize=14)
plt.grid(True, alpha=0.3)
plt.legend()
plt.xlim(0, 5.2)
plt.ylim(min(y_ref.min(), y_quintic.min())-0.5, max(y_ref.max(), y_quintic.max())+0.5)

# 显示偏离量数据（末端区域）
end_deviation = deviation[-1]
plt.text(4.0, max(y_quintic.max(), y_ref.max())+0.2, 
         f'末端偏离量: {end_deviation:.2f}', 
         fontsize=12, color='red')

plt.show()
    